const path = require('path');
const fs = require('fs');
const fsp = fs.promises;

const createLogs = require('@/utils/logs')
const logger = createLogs()

// 定义默认的响应信息
const DEFAULT_RESPONSE = {
  message: "请求成功",
  code: 200,
  data: null
};

/**
 * 创建响应对象
 * @param {object} info 响应对象
 * @param {string} [info.message] 响应信息
 * @param {number} [info.code] 响应状态码
 * @param {*} [info.data] 响应数据
 * @param {*} [info.other] 其他参数会拼接到返回对象中
 * @returns {object} 响应对象 默认值：{message: "请求成功",code: 200,data: null}
 */
function createResponse(info) {
  return {
    ...DEFAULT_RESPONSE,
    ...info
  };
}

/**
 * 创建错误响应对象
 * @param {object} error 错误信息
 * @param {string} [error.message] 错误信息
 * @param {number} [error.code] 错误状态码
 * @param {*} [error.data] 错误数据
 * @returns {object} 响应对象 默认值：{message: "服务器异常",code: 500,data: error}
 */
function createErrorResponse(error) {
  return createResponse({ message: "服务器异常", code: 500, data: `${error}` })
}


/**
 * 统一返回值
 * @param {*} req 路由参数的req
 * @param {*} res 路由参数的res
 * @param {object} [options] 返回的选项，包含信息和状态码
 * @param {string} [options.message]  返回的消息
 * @param {number} [options.code]  状态码 200成功 其他的错误会存储到日志中
 * @param {*} [options.data]  返回的数据
 * @param {*} [options.other] 其他参数会拼接到返回对象中
 * @returns {object} 响应对象 默认值：{message: "请求成功",code: 200,data: null}
 */
const sendResponse = (req, res, options) => {
  let { message, code, data, ...other } = createResponse(options);
  if (code !== 200) {
    message = message === "请求成功" ? "请求失败" : message
    logger.error(`Error in request to ${req.url}`, { error: { body: req.body, file: req.file, data } });
  }
  res.status(code).json({
    status: code === 200 ? 'success' : 'error', // 成功时 'success', 其他时 'error'
    message,
    code,
    data,
    ...other
  });
};

// 手动清空 temp 文件夹
async function clearTempFolder() {
  const tempFolder = path.join(__dirname, '../../static/temp');
  try {
    const files = await fsp.readdir(tempFolder);
    for (const file of files) {
      const filePath = path.join(tempFolder, file);
      try {
        await fsp.unlink(filePath);
        // console.log(`已成功删除文件: ${filePath}`);
        createResponse({ message: `已成功删除文件: ${filePath}` })
      } catch (err) {
        // console.error(`删除文件失败: ${filePath}`, err);
        createResponse({ message: `删除文件失败: ${filePath}`, code: 500, data: `${err}` })
      }
    }
  } catch (err) {
    // console.error('无法读取 temp 文件夹:', err);
    createResponse({ message: `无法读取 temp 文件夹`, code: 500, data: `${err}` })
  }
}

module.exports = {
  createResponse,
  createErrorResponse,
  sendResponse,
  clearTempFolder
};
